//其他新特性精选
#include <iostream>
#include <vector>
#include <mutex>
//g++ -std=c++20 3.5.cpp
using namespace std;

inline namespace tmp
{
    auto x = 10L;

    namespace A
    {
        namespace B
        {
            auto b = 10L;
        }
    }

    namespace a::b::c
    {
        auto c = 10L;
    }
}


//强类型枚举
enum class Company
{
    Apple,
    Google,
    Facebook
};

enum class gender : char {}; //枚举类还可以在后面加上类型指定枚举值存储占用的空间

int main(int argc, char const *argv[])
{
    //内联名字空间可以使用名字空间限定也可以不用
    cout << x << endl;
    cout << tmp::x << endl;

    cout << tmp::A::B::b << endl;
    cout << tmp::a::b::c::c << endl;


    // Company x = 1; 与C语言枚举不同的是 不能从整数直接转换
    auto v = Company::Apple;
    // int i = v; 与C语言枚举不同的是 不能从整数直接转换
    auto i = static_cast<int>(v); //可以强转

    //C++20允许使用using来打开枚举类 这样它用起来就和原先一样了
    using enum Company;
    auto v1 = Apple; //不再需要类名限定

    /*
    条件语句初始化
    if (init; cond) {}
    */
    vector<int> vec {1,2,3};
    if (auto pos = vec.end(); !vec.empty()) //pos值只在if中有效
    {

    }
    //条件语句初始化 一个实用的场景是在多线程编程里锁定互斥量 在if判断后自动解锁
    if (scoped_lock g;vec.empty())
    {

    }
    
    class Temp {
    public:
        ~Temp()
        {
            cout << "temp destructor called" << endl; //会在if语句范围后调用析构函数销毁
        }
    };

    if (Temp t;!vec.empty())
    {
        cout << "1" << endl;
    }
    cout << "2" << endl;

    //二进制字面值
    auto a = 010;  //八进制
    auto b = 0x10; //十六进制
    auto x = 0b11010; //二进制
    //数字分位符 方便阅读
    auto c = 0b1101'1101'0001;
    auto d = 0x10'01'11'00;
    return 0;
}
